package main

import "fmt"

/*

数组是一个由固定长度的特定类型元素组成的序列，一个数组可以由零个或多个元素组成。因为数组的长度是固定的，所以在Go语言中很少直接使用数组。

和数组对应的类型是Slice（切片），Slice是可以增长和收缩的动态序列，功能也更灵活，但是想要理解slice工作原理的话需要先理解数组。

声明方式：

var 数组变量名 [元素数量]Type
var 数组变量名 [元素数量]Type = [元素数量]Type{e1, e2, e3...}
var 数组变量名 = [...]Type{e1, e2, e3...}
数组变量名 := [元素数量]Type{e1, e2, e3...}
数组变量名 := [...]Type{e1, e2, e3...}

*/

func main() {

	var a [3]int             // 定义三个整数的数组
	fmt.Println(a[0])        // 打印第一个元素
	fmt.Println(a[len(a)-1]) // 打印最后一个元素

	// 打印索引和元素
	// range返回的是每个元素的副本，而不是直接返回对该元素的引用。
	for i, v := range a {
		fmt.Printf("%d %d\n", i, v)
	}

	// 仅打印元素
	for _, v := range a {
		fmt.Printf("%d\n", v)
	}

	// 默认情况下，数组的每个元素都会被初始化为元素类型对应的零值，对于数字类型来说就是0，同时也可以使用数组字面值语法，用一组值来初始化数组：
	var q [3]int = [3]int{1, 2, 3}
	var r [3]int = [3]int{1, 2}
	fmt.Println(q[2])
	fmt.Println(r[2])

	// 如果在数组长度的位置出现“...”省略号，则表示数组的长度是根据初始化值的个数来计算：
	var q1 = [...]int{1, 2, 3}
	fmt.Printf("%T\n", q1)

	// 比较两个数组是否相等
	a1 := [2]int{1, 2}
	b1 := [...]int{1, 2}
	c1 := [2]int{1, 3}
	fmt.Println(a1 == b1, a1 == c1, b1 == c1)
	// d1 := [3]int{1, 2}
	// fmt.Println(a1 == d1) // 编译错误

	// 遍历数组
	var words [3]string
	words[0] = "a"
	words[1] = "b"
	words[2] = "c"

	for i, v := range words {
		fmt.Printf("%d %s\n", i, v)
	}
}
